<?
class bbcode
{
	//Object để truyền dữ liệu (id của thẻ textare)
	var $object_id		= '';
	//Đường dẫn ảnh icon
	var $image_path		= '/images/wys/';
	//Khai báo font chữ
	var $font_array		= array('Arial', 'Comic Sans MS', 'Courier New', 'Times New Roman', 'Tahoma', 'Verdana');
	var $img_font_array	= array();
	var $tag_font_array	= array();
	//Khai báo size chữ
	var $size_array		= array('xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large');
	var $img_size_array	= array();
	var $tag_size_array	= array();
	//Thiết lập max số lần replace Emotion trong đoạn BBCode
	var $max_emoticon 	= 35;
	//Yahoo icon
	var $yahoo_array	= array(//--- Primary Smile (54) ---
								"[:)]" 		=> "yahoo_smiley.gif",
								"[:(]" 		=> "yahoo_sad.gif",
								"[;)]" 		=> "yahoo_wink.gif",
								"[:D]" 		=> "yahoo_bigsmile.gif",
								"[;;)]" 	=> "yahoo_batting.gif",
								"[):D(]" 	=> "yahoo_huggs.gif",
								"[:-/]" 	=> "yahoo_question.gif",
								"[:x]" 		=> "yahoo_love.gif",
								"[:,)]" 	=> "yahoo_blush.gif",
								"[:-P]" 	=> "yahoo_tongue.gif",
								"[:-*]" 	=> "yahoo_kiss.gif",
								"[=((]" 	=> "yahoo_brokenheart.gif",
								"[:-O]" 	=> "yahoo_ooooh.gif",
								"[X-(]" 	=> "yahoo_angry.gif",
								"[:-)]" 	=> "yahoo_mean.gif",
								"[B-)]" 	=> "yahoo_sunglas.gif",
								"[:-S]" 	=> "yahoo_worried.gif",
								"[#:-S]" 	=> "yahoo_sweating.gif",
								"[):)]" 	=> "yahoo_devil.gif",
								"[:((]" 	=> "yahoo_cry.gif",
								"[:))]" 	=> "yahoo_laughloud.gif",
								"[:|]" 		=> "yahoo_neutral.gif",
								"[/:)]" 	=> "yahoo_eyebrow.gif",
								"[=))]" 	=> "yahoo_rotfl.gif",
								"[O:)]" 	=> "yahoo_angel.gif",
								"[:-B]" 	=> "yahoo_glasses.gif",
								"[=;]" 		=> "yahoo_bye.gif",
								"[I-)]" 	=> "yahoo_sleep.gif",
								"[8-|]" 	=> "yahoo_eyeroll.gif",
								"[L-)]" 	=> "yahoo_loser.gif",
								"[:-&]" 	=> "yahoo_sick.gif",
								"[:-\$]" 	=> "yahoo_shhhh.gif",
								"[[-(]" 	=> "yahoo_silent.gif",
								"[:o)]" 	=> "yahoo_clown.gif",
								"[8-}]" 	=> "yahoo_silly.gif",
								"[(:-P]" 	=> "yahoo_party.gif",
								"[(:|]" 	=> "yahoo_tired.gif",
								"[=P~]" 	=> "yahoo_drool.gif",
								"[:-?]" 	=> "yahoo_think.gif",
								"[#-o]" 	=> "yahoo_doh.gif",
								"[=D)]" 	=> "yahoo_clap.gif",
								"[:-SS]" 	=> "yahoo_nailbiting.gif",
								"[@-)]" 	=> "yahoo_hypnotized.gif",
								"[:^O]" 	=> "yahoo_liar.gif",
								"[:-w]" 	=> "yahoo_waiting.gif",
								"[:-(]" 	=> "yahoo_sighing.gif",
								"[):P]" 	=> "yahoo_madtongue.gif",
								"[():)]"	=> "yahoo_cowboy.gif",
								"[:)}]" 	=> "yahoo_onphone.gif",
								"[:-c]" 	=> "yahoo_callme.gif",
								"[~x(]" 	=> "yahoo_witsend.gif",
								"[:-h]" 	=> "yahoo_wave.gif",
								"[:-t]" 	=> "yahoo_timeout.gif",
								"[8-)]" 	=> "yahoo_daydream.gif",
								//--- Extension Smile (34) ---
								"[:@)]" 	=> "yahoo_pig.gif",
								"[3:-0]" 	=> "yahoo_cow.gif",
								"[:(|)]" 	=> "yahoo_monkey.gif",
								"[~:)]" 	=> "yahoo_chicken.gif",
								"[@};-]"	=> "yahoo_flower.gif",
								"[%%-]" 	=> "yahoo_shamrock.gif",
								"[**==]"	=> "yahoo_flag.gif",
								"[(~~)]"	=> "yahoo_pumpkin.gif",
								"[~o)]" 	=> "yahoo_coffee.gif",
								"[*-:)]"	=> "yahoo_idea.gif",
								"[8-x]" 	=> "yahoo_ghost.gif",
								"[=:)]" 	=> "yahoo_alien.gif",
								"[)-)]" 	=> "yahoo_alien2.gif",
								"[:-l]" 	=> "yahoo_frustrated.gif",
								"[-o(]" 	=> "yahoo_pray.gif",
								"[\$-)]" 	=> "yahoo_moneyeyes.gif",
								"[:-,]" 	=> "yahoo_whistling.gif",
								"[b-(]" 	=> "yahoo_beatup.gif",
								"[:))-]"	=> "yahoo_peace.gif",
								"[[-x]" 	=> "yahoo_shame.gif",
								"[Y:d/]"	=> "yahoo_dance.gif",
								"[):/]" 	=> "yahoo_waving.gif",
								"[;))]" 	=> "yahoo_giggle.gif",
								"[o-)]" 	=> "yahoo_malefighter1.gif",
								"[0=)]" 	=> "yahoo_malefighter2.gif",
								"[o-+]" 	=> "yahoo_femalefighter.gif",
								"[(%)]" 	=> "yahoo_yingyang.gif",
								"[:-@]" 	=> "yahoo_talktohand.gif",
								"[^:)^]"	=> "yahoo_worship.gif",
								"[:-j]" 	=> "yahoo_youkiddingme.gif",
								"[(*)]" 	=> "yahoo_star.gif",
								"[:-??]"	=> "yahoo_dontknow.gif",
								"[%-(]" 	=> "yahoo_notlistening.gif",
								"[-(:D)-]"	=> "yahoo_dance_hiphop.gif",
								);
	/**
	 * Function khởi tạo
	 *
	 */
	function bbcode()
	{
		// Tạo ra array font và array size
		$this->create_font();
		$this->create_size();
	}
	
	/**
	 * Function add bbcode vào thẻ textarea
	 *
	 * @param object $object_id object sẽ truyền dữ liệu bbcode
	 * @return string
	 */
	function add($object_id)
	{
		// Lưu vào biến toàn cục
		$this->object_id = $object_id;
		
		// Danh sách ảnh đại diện cho từng thẻ
		$img_array = $this->img_array();
		
		$format	= 'text';
		$temp = '<script type="text/javascript" language="javascript" src="/js/wz_tooltip.js"></script>';
		$temp .= '<div align="left">';
		
		// Loop để tạo ra các thẻ image tương ứng
		foreach ($img_array as $key => $value)
		{
			if ($value == 'break')
			{
				$temp .= '<br />';
				$format = $key;
				continue;
			}
			switch ($format)
			{
				case 'text':
					$temp .= '<img align="absmiddle" border="0" hspace="1" src="' . $this->image_path . $value . '" style="cursor:pointer" onClick="addArticleCode(\'' . $key . '\',\'' . $this->object_id . '\')" />';
					break;
				case 'yahoo_smiley':
					if ($key != "more_smiley")
					{
						$temp .= '<img title="' . $key . '" align="absmiddle" border="0" hspace="1" style="cursor:pointer; margin-bottom:3px" src="' . $this->image_path . $value . '" onClick="addEmoticons(\'' . $key . '\',\'' . $this->object_id . '\')" />';
					}
					else
					{
						$temp .= '<img title="Những Smile khác" align="absmiddle" border="0" hspace="1" style="cursor:pointer; margin-bottom:3px;" src="' . $this->image_path . $value . '" onclick="Tip(\'' . $this->generate_smile() . '\', BORDERCOLOR , \'#bbccdd\', CLOSEBTN, true, CLOSEBTNCOLORS, [\'\', \'#FFFFFF\', \'white\', \'#FF0000\'], STICKY, true, TITLE , \'Danh sách Smilies\', WIDTH, 362)" />';
					}
					break;
				case 'format_text':
					if ($key == 'create_link')
					{
						$temp .= '<img title="Tạo link" align="absmiddle" border="0" hspace="1" src="' . $this->image_path . $value . '" style="cursor:pointer" onClick="addLink(\'' . $this->object_id . '\')" />';
					}
					else
					{
						$temp .= '<select title="' . $key . '" class="form_control" onChange="addArticleCode(this.value,\'' . $this->object_id . '\')" style="cursor:pointer">';
						$temp .= '<option value="">--[' . $key . ']--</option>';
						foreach ($value as $mkey => $mvalue)
						{
							$temp .= '<option title="' . $mvalue . '" value="' . $mkey . '">' . $mvalue . '</option>';
						}
						$temp .= '</select>';
					}
					break;
				default:
					break;
			}
		}// End foreach($img_array as $key => $value)
		
		$temp .= '</div>';
		
		//Return value
		return $temp;
	}
	
	/**
	 * Function show bbcode
	 *
	 * @param string $temp Biến sẽ được thay thế các ký tự bbcode
	 * @return string
	 */
	function show($temp)
	{
		// Tạo ra các array để replace
		$arr_str = array_keys($this->tag_array());
		$arr_rep = array_values($this->tag_array());
		
		// Replace giá trị của biến temp
		$temp = str_replace($arr_str, $arr_rep, $temp);
		$temp = str_replace('\n', '<br />', $temp);
		
		// bat url 
		$temp = $this->create_url($temp);
		
		// Thay thế Emotion Yahoo
		$temp = $this->replaceEmoticon($temp);
		
		// Trả về giá trị mới của biến $temp
		return $temp;
	}
	
	/*
	Function remove bbcode
	1. $temp	: Biến sẽ được remove các ký tự bbcode
	*/
	function remove($temp)
	{
		//Tạo ra các array để replace
		$arrTemp = array_merge($this->yahoo_array, $this->tag_array());
		$arrRep = array_keys($arrTemp);
		$arrRep[] = "[/url]";
		
		//Replace giá trị của biến temp
		$temp = str_replace($arrRep, ' ', $temp);
		$temp = str_replace('\n', ' ', $temp);
		$temp = str_replace('  ', ' ', $temp);
		$temp = str_replace('  ', ' ', $temp);
		
		// Replace thẻ [url][/url]
		$temp = preg_replace ('/\[url=.*?\]/si', '', $temp);
		
		//Trả về giá trị mới của biến $temp
		return $temp;
	}
	
	/**
	 * Function tạo ra các image đại diện từng thẻ khi add dữ liệu
	 *
	 * @return array
	 */
	function img_array()
	{
		$img_array	= array(//-- Format text here --
							"[b]" 			=> "bold.gif",
							"[i]" 			=> "italic.gif",
							"[u]" 			=> "underline.gif",
							"[left]"		=> "left.gif",
							"[center]" 		=> "center.gif",
							"[right]" 		=> "right.gif",
							"[justify]" 	=> "justify.gif",
							"[sup]"			=> "superscript.gif",
							"[sub]" 		=> "subscript.gif",
							"[red]" 		=> "red.gif",
							"[green]" 		=> "green.gif",
							"[blue]" 		=> "blue.gif",
							"[quote]" 		=> "quote.gif",
							//"[img]" 			=> "image.gif", //Insert Image (Not recommend beacause XSS error)
							//-- Yahoo Smile here ---
							"yahoo_smiley"	=> "break",
							"[:)]" 			=> "yahoo_smiley.gif",
							"[:(]" 			=> "yahoo_sad.gif",
							"[;)]" 			=> "yahoo_wink.gif",
							"[:D]" 			=> "yahoo_bigsmile.gif",
							"[;;)]" 		=> "yahoo_batting.gif",
							"[):D(]" 		=> "yahoo_huggs.gif",
							"[:-/]" 		=> "yahoo_question.gif",
							"[:x]" 			=> "yahoo_love.gif",
							"[:,)]" 		=> "yahoo_blush.gif",
							"[:-P]" 		=> "yahoo_tongue.gif",
							"[:-*]" 		=> "yahoo_kiss.gif",
							"more_smiley" 	=> "more.gif",
							//-- Format text here ---
							"format_text"	=> "break",
							"Font chữ"		=> $this->img_font_array,
							"Cỡ chữ"		=> $this->img_size_array,
							"create_link" 	=> "create_link.gif",
							);
		
		//Return array
		return $img_array;
	}
	
	/**
	 * Function tạo ra các tag array để show dữ liệu
	 *
	 * @return array
	 */
	function tag_array()
	{
		// dinh nghia các thẻ phần hiển thị
		$tag_array	= array (//-- Format text here --
							"[b]"			=> "<b>",
							"[/b]" 			=> "</b>",
							"[i]" 			=> "<i>",
							"[/i]" 			=> "</i>",
							"[u]" 			=> "<u>",
							"[/u]" 			=> "</u>",
							"[left]" 		=> '<div align="left">',
							"[/left]" 		=> "</div>", 
							"[center]" 		=> '<div align="center">',
							"[/center]" 	=> "</div>", 
							"[right]" 		=> '<div align="right">',
							"[/right]" 		=> "</div>",
							"[justify]" 	=> '<div align="justify">',
							"[/justify]" 	=> "</div>",
							"[sup]"			=> "<sup>",
							"[/sup]" 		=> "</sup>",
							"[sub]"			=> "<sub>",
							"[/sub]" 		=> "</sub>",
							"[red]"			=> '<font color="#FF0000">',
							"[/red]" 		=> "</font>",
							"[green]" 		=> '<font color="#00FF00">',
							"[/green]" 		=> "</font>",
							"[blue]" 		=> '<font color="#4646FE">',
							"[/blue]" 		=> "</font>",
							"[quote]" 		=> '<div style="margin:5px; margin-left:15px"><div style="margin-bottom:2px; font-style:normal">Trích dẫn:</div><div class="quote">',
							"[/quote]" 		=> "</div></div>",
							//"[img]" 		=> "<img align=\"absmiddle\" src=\"", //Insert Image (Not recommend beacause XSS error)
							//"[/img]" 		=> "\" />", //Insert Image (Not recommend beacause XSS error)
							);
		$tag_array += $this->tag_font_array;
		$tag_array += $this->tag_size_array;
		
		/*
		// Reset lại $yahoo_array để loop
		reset($this->yahoo_array);
		
		// Loop để nối thêm vào array $tag_array
		foreach ($this->yahoo_array as $key => $value)
		{
			$tag_array += array($key => ' <img title="' . $key . '" align="absmiddle" border="0" hspace="1" src="' . $this->image_path . $value . '" />');
		}
		*/
		
		//Return array
		return $tag_array;
	}
	
	/**
	 * Function tạo font chữ
	 *
	 */
	function create_font()
	{
		$count = count($this->font_array);
		for ($i=1;$i<=$count;$i++)
		{
			$this->img_font_array['[font_' . $i . ']'] = $this->font_array[$i-1];
			$this->tag_font_array['[font_' . $i . ']'] = '<font face="' . $this->font_array[$i-1] . '">';
			$this->tag_font_array['[/font_' . $i . ']'] = '</font>';
		}
	}
	
	/**
	 * Function ham bat url Toan code
	 *
	 * @param string $string
	 * @return string
	 */
	function create_url($string)
	{
		global $con_root_path;
		// url dung de direct
		$urlredirect = $con_root_path . "redirect.php?redirect=";
		
		// dinh nghia luat thu nhat se bat url theo kieu [url=http://jdsljflds]text[/url]
		$i = 0;
		$patterns[$i] = "#\[url=([(http|https|ftp)]+?://){1}([a-z0-9\-\.,\?!%\*_\#:;~\\&$@\/=\+\(\)]+)\](.*?)\[/url\]#sie";
		$replacements[$i] = "'<a href=\"" . $urlredirect . "'.base64_encode('http://\\2').'\" target=\"_blank\" rel=\"nofollow\">\\3</a>'";
		// [url=www.mua88.com]text[/url] code.. (no xxxx:// prefix).
		
		return preg_replace($patterns, $replacements, $string);
	}

	/**
	 * Function tạo cỡ chữ
	 *
	 */
	function create_size()
	{
		$count = count($this->size_array);
		for ($i=1;$i<=$count;$i++)
		{
			$this->img_size_array['[size_' . $i . ']'] = $this->size_array[$i-1];
			$this->tag_size_array['[size_' . $i . ']'] = '<font size="' . $i . '" style="line-height:normal">';
			$this->tag_size_array['[/size_' . $i . ']']	= '</font>';
		}
	}
	
	/**
	 * Function tạo ra danh sách smile
	 *
	 * @return string
	 */
	function generate_smile()
	{
		// Số cột hiển thị mỗi hàng
		$num_col = 8;
		
		// Reset lại $yahoo_array để loop
		reset($this->yahoo_array);
		
		// Kiểm tra xem có phần tử hay không
		if (list($key, $value) = each($this->yahoo_array))
		{
			$go_next = 1;
		}
		else
		{
			$go_next = 0;
		}
		
		// Mở <table>
		$variable_store = '<table cellpadding="3" cellspacing="0" width="100%" border="1" bordercolor="#CCCCCC" style="background:#FFFFFF; border-collapse:collapse">';
		
		//Loop array
		while ($go_next == 1)
		{
			// Mở <tr>
			$variable_store .= '<tr>';
			
			// Loop <td>
			for ($i=0;$i<$num_col;$i++)
			{
				//Mở <td>
				$variable_store .= '<td align="center">';
				if ($go_next == 1)
				{
					$variable_store .= '<img title="' . $key . '" src="' . $this->image_path . $value . '" style="cursor:pointer" onClick="addEmoticons(\'' . $key . '\',\'' . $this->object_id . '\')" />';
				}
				// Đóng </td>
				$variable_store .= '</td>';
				
				// Kiểm tra xem có phần tử hay không
				if (list($key, $value) = each($this->yahoo_array))
				{
					$go_next = 1;
				}
				else
				{
					$go_next = 0;
				}
			}// End for($i=0; $i<$num_col; $i++)
			
			// Đóng </tr>
			$variable_store .= '</tr>';
		}
		
		// Đóng </table>
		$variable_store .= '</table>';
		
		// Replace thẻ để chống phá ngoặc
		$arr_str = array('"', "'", "<", ">");
		$arr_rep = array("&quot;", "\\'", "&lt;", "&gt;");
		$variable_store = str_replace($arr_str, $arr_rep, $variable_store);
		
		// Trả về giá trị của hàm
		return $variable_store;
	}
	
	/**
	 * Thay thế icon Emoticon của Yahoo
	 *
	 * @param string $inputString Chuỗi đầu vào BBCode
	 * @return string
	 */
	function replaceEmoticon($inputString)
	{
		// Reset lại $yahoo_array để loop
		reset($this->yahoo_array);
		
		$emoticon_array = array();
		//Loop để nối thêm vào array $tag_array
		foreach ($this->yahoo_array as $key => $value)
		{
			$emoticon_array += array($key => ' <img title="' . $key . '" align="absmiddle" border="0" hspace="1" src="' . $this->image_path . $value . '" />');
		}
		
		// Tạo ra các array để replace
		$arr_str = array_keys($emoticon_array);
		$arr_rep = array_values($emoticon_array);
		
		// Replace giá trị của biến inputString
		$temp = str_replace($arr_str, $arr_rep, $inputString, $count_replace);

		// Nếu số lần replace nằm trong khoảng max thì return temp
		if ($count_replace <= $this->max_emoticon)
		{
			// Trả về string đã replace
			return $temp;
		}
		else
		{
			// Nếu quá nhiều emoticon bắt đầu khoanh vùng lấy max_emoticon đầu rồi replace sau đó ghép vào đuôi sau
			$last_allow_postion = $this->strnpos($inputString, "[", $this->max_emoticon);
			// Nếu tìm đc vị trí last_allow_postion thì bắt đầu cắt và replace
			if ($last_allow_postion !== false)
			{
				$begin_str = substr($inputString, 0, $last_allow_postion);
				$end_str = substr($inputString, $last_allow_postion, strlen($inputString) - $last_allow_postion);
				// Replace phần đầu và ghép thêm đuôi vào
				$temp = str_replace($arr_str, $arr_rep, $begin_str) . $end_str;
				
				return $temp;
			}
			// Nếu không tìm đc trả về chuỗi nguyên thủy
			else
			{
				return $inputString;
			}
		}
	}
	
	/**
	 * Tìm vị trí thứ n của ký tự cần tìm trong 1 chuỗi
	 *
	 * @param string $base Chuỗi được tìm
	 * @param string $str Chuỗi cần tìm
	 * @param int $n Thứ tự 1,2,3 ...v..v
	 * @return int Trả về vị trí của chuỗi $str xuất hiện lần thứ $n trong $base
	 */
	function strnpos($base, $str, $n)
	{
		if ($n <= 0 || intval($n) != $n || substr_count($base, $str) < $n)
		{
			return false;
		}
		
		$str = strval($str);
		$len = 0;
		
		for ($i=0;$i<$n-1;++$i)
		{
			if (strpos($base, $str) === false)
			{
				return false;
			}
			
			$len += strlen( substr($base, 0, strpos($base, $str) + strlen($str)) );
			
			$base = substr($base, strpos($base, $str) + strlen($str) );
		}
		
		return strpos($base, $str) + $len;
	}	
}